\chapter{网络}

\section{因特网}

\subsection{因特网（Internet）}

因特网是一个世界范围的计算机网络，它互联了遍及全世界数十亿的计算设备，所有这些设备都称为主机（host）或端系统（end system）。端系统通过通信链路（communication link）和分组交换机（packet switch）连接到一起，不同的链路能够以不同的速率传输数据，链路的传输速率（transmission rate）使用比特/秒（bps, bit/s）来度量。端系统通过因特网服务提供商（ISP, Internet Service Provider）接入因特网。\\

当一台端系统向另一台端系统发送数据时，发送端将数据分组，发送到目的端系统，在那里进行组装。一个分组所经历的一系列通信链路和分组交换机称为路径（route / path）。分组交换类似于现实中的货物运输，在出发地将货物分开并装上多辆卡车，每辆卡车独立通过公路运输，最后在目的地卸货并重新组装。\\

\subsection{分布式应用程序（Distributed Application）}

分布式应用程序涉及多个相互交换数据的端系统，例如即时通信、实时道路信息、视频会议、多人游戏等。分布式应用程序的核心问题在于一个端系统上的应用程序如何能够向运行在另一个端系统上的应用程序发送数据。\\

套接字接口（socket interface）规定了运行在一个端系统上的程序向运行在另一个端系统上的特定程序交付数据的方式。例如Alice要给Bob寄一封信，当然Alice不能只是写完这封信就把它丢出窗外。Alice需要把信放入信封，在信封上根据指定格式写上收信人的全名、地址和邮政编码，信封上贴上邮票，再将信封投入信箱中。Alice想要寄信就必须要遵守邮政服务制定的这一套规则。因此，发送数据的程序也必须遵守socket接口，才能向接收数据的程序发送数据。\\

\subsection{协议（Protocol）}

在两个人或两台设备之间进行通信时需要遵守一些协议，协议就是用于管理通信的一组规则。传输控制协议TCP（Transmission Control Protocol）和网际协议IP（Internet Protocol）是因特网中两个最为重要的协议，因特网的主要协议统称为TCP/IP。\\

因特网标准（Internet standard）是经过充分测试的规约，只要是与因特网打交道，就会用到它们，并要服从于它们。因特网标准由IETF（Internet Engineering Task Force）研发，IETF的标准文档称为RFC (Request For Comment)，目的是解决因特网先驱者们面临的网络和协议问题。它们定义了TCP、IP、HTTP、SMTP等协议，目前已经有将近7000个RFC。\\

人类无时无刻都在执行协议，人类用约定好的交互方式互相交流。但是如果两人的交谈都不在同一频道上，那就不能好好沟通了。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \node at (0,6) {A};
        \node at (8,6) {B};

        \draw[loosely dashed, <-] (0,0) -- (0,5);
        \draw[loosely dashed, <-] (8,0) -- (8,5);

        \draw[blue, ->, thick] (0,5) -- (8,4) node[above, midway, sloped]{Hi};
        \draw[blue, ->, thick] (8,4) -- (0,3) node[above, midway, sloped]{Hi};
        \draw[blue, ->, thick] (0,3) -- (8,2) node[above, midway, sloped]{Got the time?};
        \draw[blue, ->, thick] (8,2) -- (0,1) node[above, midway, sloped]{2:00};
    \end{tikzpicture}
    \caption{人类协议}
\end{figure}

在因特网中，涉及两个或多个远程通信实体的所有活动都受协议的制约。例如在浏览器中输入URL（Uniform Resource Locator）向一个Web服务器发出请求，首先你的计算机将向该Web服务器发送一条连接请求报文，并等待回答。Web服务器接收到连接请求报文，并返回一条连接响应报文。在得知请求正常后，计算机会发送一条要获取的网页名字的报文，最后Web服务器向计算机返回该网页。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \node at (0,9) {A};
        \node at (8,9) {B};

        \draw[loosely dashed, <-] (0,0) -- (0,8);
        \draw[loosely dashed, <-] (8,0) -- (8,8);

        \draw[blue, ->, thick] (0,8) -- (8,6) node[above, midway, sloped]{TCP connection request};
        \draw[blue, ->, thick] (8,6) -- (0,4) node[above, midway, sloped]{TCP connection reply};
        \draw[blue, ->, thick] (0,4) -- (8,2) node[above, midway, sloped]{Get http://www.awl.com/kurose-ross};
        \draw[blue, ->, thick] (8,2) -- (0,0) node[above, midway, sloped]{<file>};
    \end{tikzpicture}
    \caption{网络协议}
\end{figure}

\newpage

\section{分组交换}

\subsection{存储转发传输（Store-and-Forward Transmission）}

在网络应用中，端系统彼此交换报文（message），报文能够包含任何数据。报文从源端系统发送到目的端系统的过程中，长报文会被划分为较小的数据块，称为分组（packet），每个分组都通过通信链路和分组交换机传送。如果源端系统发送一个$ L $ bits分组，链路的传输速率为$ R $ bits/sec，则传输该分组的时间为$ L \over R $秒。\\

多数分组交换机在链路的输入端使用存储转发传输机制，存储转发传输是指在交换机能够开始向输出链路传输该分组的第一个bit之前，必须接收到整个分组。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,0) rectangle (2,1);
        \node at (1,0.5) {source};
        \draw (11,0) rectangle (13,1);
        \node at (12,0.5) {destination};
        \draw (6.5,0.5) ellipse (0.7 and 0.5);
        \draw[-] (6,0.9) -- (7,0.1);
        \draw[-] (7,0.9) -- (6,0.1);

        \draw[->, very thick] (2,0.5) -- (5.8,0.5);
        \draw[->, very thick] (7.3,0.5) -- (11,0.5);

        \draw (2.5,1) rectangle (3.5,2);
        \draw (2.833,1) -- (2.833,2);
        \draw (3.133,1) -- (3.133,2);
        \node at (2.65,1.5) {3};
        \node at (3,1.5) {2};
        \node at (3.3,1.5) {1};
    \end{tikzpicture}
    \caption{存储转发}
\end{figure}

假设忽略传播时延（propagation delay），源端系统在时间0开始传输，路由器在时间$ L \over R $刚好接收到整个分组，之后再向输出链路开始传输，在时间$ 2 {L \over R} $整个分组被目的端系统接收。\\

因此，由$ N $条速率为$ R $的链路组成的路径（在源和目的地之间有$ N - 1 $台路由器）发送一个分组，端到端的时延为

\vspace{-0.5cm}

\begin{align}
    d = N {L \over R}
\end{align}

\vspace{0.5cm}

\subsection{时延}

当从一个节点到后继节点，一个分组在沿途的每个节点都经受了几种不同类型的时延，包括节点处理时延（nodal processing delay）、排队时延（queuing delay）、传输时延（transmission delay）、传播时延（propagation delay）。\\

处理时延包括了检查分组首部和决定分组去向所需要的时间，以及检查差错的时间。\\

分组交换机的每条链路都有一个输出缓存/输出队列（output buffer / output queue）。如果到达的分组需要传输到某条链路，但发现该链路正忙于传输其它分组，该分组必须在输出缓存中等待。因此，除了存储转发时延以外，分组还要承受输出缓存的排队时延。由于缓存空间的大小是有限的，到达的分组可能发现该缓存已被填满，这种情况下将出现丢包（packet loss），到达的分组或已经排队的分组将被丢弃。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,1) rectangle (1,2);
        \node at (0.5,1.5) {A};
        \draw (0,-2) rectangle (1,-1);
        \node at (0.5,-1.5) {B};

        \draw (6,0) ellipse (0.7 and 0.5);
        \draw[-] (5.5,0.3) -- (6.5,-0.3);
        \draw[-] (5.5,-0.3) -- (6.5,0.3);

        \draw[->, very thick] (1,1.5) -- (5.3,0);
        \draw[->, very thick] (1,-1.5) -- (5.3,0);

        \draw (1.5,1.5) rectangle (2.5,2);
        \draw (1.5,-2) rectangle (2.5,-1.5);
        \node at (4,1) {100 Mbps};

        \draw (10,0) ellipse (0.7 and 0.5);
        \draw[-] (9.5,0.3) -- (10.5,-0.3);
        \draw[-] (9.5,-0.3) -- (10.5,0.3);

        \draw[->, very thick] (6.7,0) -- (9.3,0);

        \draw (7,0.5) rectangle (8.5,1);
        \draw[-] (7.5,0.5) -- (7.5,1);
        \draw[-] (8,0.5) -- (8,1);
        \node at (8,-0.5) {15 Mbps};

        \draw (5.5,-1.2) rectangle (6.5,-0.7);
        \node at (6,-1) {...};
    \end{tikzpicture}
    \caption{排队时延}
\end{figure}

分组通常是以FCFS（First-Come-First-Served）的方式传输，只有当所有已经到达的分组被传输之后，才能传输新到达的分组。传输时延$ L \over R $就是将所有分组推向输出链路所需的时间。\\

传播时延是指从链路的起点到下一个路由器传播所需的时间。\\

假设$ d_{proc} $、$ d_{queue} $、$ d_{trans} $和$ d_{prop} $分别表示处理时延、排队时延、传输时延和传播时延，那么节点总时延为

\vspace{-0.5cm}

\begin{align}
    d_{nodal} = d_{proc} + d_{queue} + d_{trans} + d_{prop}
\end{align}

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,1) rectangle (1,2);
        \node at (0.5,1.5) {A};
        \draw (0,-2) rectangle (1,-1);
        \node at (0.5,-1.5) {B};

        \draw (6,0) ellipse (0.7 and 0.5);
        \draw[-] (5.5,0.3) -- (6.5,-0.3);
        \draw[-] (5.5,-0.3) -- (6.5,0.3);

        \draw[->, very thick] (1,1.5) -- (5.3,0);
        \draw[->, very thick] (1,-1.5) -- (5.3,0);

        \draw (1.5,1.5) rectangle (2.5,2);
        \draw (1.5,-2) rectangle (2.5,-1.5);

        \draw (10,0) ellipse (0.7 and 0.5);
        \draw[-] (9.5,0.3) -- (10.5,-0.3);
        \draw[-] (9.5,-0.3) -- (10.5,0.3);

        \draw[->, very thick] (6.7,0) -- (9.3,0);

        \draw (7,0.5) rectangle (8.5,1);
        \draw[-] (7.5,0.5) -- (7.5,1);
        \draw[-] (8,0.5) -- (8,1);

        \draw (5.5,-1.2) rectangle (6.5,-0.7);
        \node at (6,-1) {...};
        \draw[dashed, ->] (6.5,-1) -- (7,-2);
        \node at (7,-2.2) {queuing};

        \draw[dashed, ->] (5.3,0) -- (4.5,-2);
        \node at (4.5,-2.3) {nodal processing};

        \draw[dashed, ->] (6.8,0) -- (6,2);
        \node at (6,2.3) {transmission};

        \draw[dashed, ->] (8,0) -- (9,-2);
        \node at (9,-2.3) {propagation};
    \end{tikzpicture}
    \caption{时延}
\end{figure}

\vspace{0.5cm}

\subsection{转发表（Forwarding Table）}

路由器从输入链路获得分组，然后向输出链路发送分组，但是路由器怎样决定应当向哪一条链路发送呢？\\

因特网中每一个端系统都有一个IP地址，源在发送分组时在分组首部包含了目的地的IP地址。当分组到达每一个路由器时，路由器根据转发表，为其查询适当的输出链路。\\

端到端的选路过程类似于现实中的问路，每到一个地点都询问别人路线，逐步找到最终的目的地。在这个类比中，被问路的人就类似于路由器。\\

\subsection{traceroute}

traceroute是诊断网络问题时常用的工具，它可以定位从源主机到目标主机之间经过了哪些路由器，以及到达各个路由器的耗时。当源主机向目标主机发送消息，发现消息无法送达。此时，可能是某个中间节点发生了问题，比如某个路由器因负载过高产生了丢包。通过traceroute可以定位网络包在是在哪个节点丢失的。\\

traceroute将从源发送N个特殊的分组，当第i个路由器收到第i个分组时，该路由器会向源回送一个报文，记录了路由器的名字和地址。traceroute会重复该实验3次。\\

\mybox{traceroute (Linux) / tracert (Windows)}

\begin{lstlisting}
tracert www.github.com
\end{lstlisting}

\begin{tcolorbox}
    \mybox{运行结果}
    \begin{verbatim}
1     2 ms     9 ms     2 ms  HS8145V [192.168.1.1]
2     5 ms    15 ms     5 ms  100.65.0.1
3     5 ms     5 ms     5 ms  124.74.22.41
4    25 ms     6 ms    17 ms  101.95.88.138
5     *        *        *     请求超时。
6     *        *        *     请求超时。
7     *        *        *     请求超时。
8    30 ms    32 ms    35 ms  106.38.244.146
9     *        *        *     请求超时。
10     *        *        *     请求超时。
11     *        *        *     请求超时。
12    30 ms    31 ms    31 ms  220.181.38.251
	\end{verbatim}
\end{tcolorbox}

\newpage

\section{协议层}

\subsection{协议栈（protocol stack）}

因特网是个极其复杂的系统，因此因特网的体系存在分层的组织结构。类似一次乘飞机的过程，首先需要购票、托运行李、登机，飞行到目的地后，需要离机、认领行李，如果对航班不满意，还可以在向票务机构投诉。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (-7,8) rectangle (-3,9);
        \node at (-5,8.5) {票务（购票）};

        \draw (-7,6) rectangle (-3,7);
        \node at (-5,6.5) {行李（托运）};

        \draw (-7,4) rectangle (-3,5);
        \node at (-5,4.5) {登机口（登机）};

        \draw (-7,2) rectangle (-3,3);
        \node at (-5,2.5) {跑道（起飞）};

        \draw (-2,0) rectangle (2,1);
        \node at (0,0.5) {飞行};

        \draw (7,2) rectangle (3,3);
        \node at (5,2.5) {跑道（降落）};

        \draw (7,4) rectangle (3,5);
        \node at (5,4.5) {登机口（离机）};

        \draw (7,6) rectangle (3,7);
        \node at (5,6.5) {行李（认领）};

        \draw (7,8) rectangle (3,9);
        \node at (5,8.5) {票务（投诉）};

        \draw[->] (-5,8) -- (-5,7);
        \draw[->] (-5,6) -- (-5,5);
        \draw[->] (-5,4) -- (-5,3);
        \draw[->] (-5,2) -- (-2,1);
        \draw[->] (2,1) -- (5,2);
        \draw[->] (5,3) -- (5,4);
        \draw[->] (5,5) -- (5,6);
        \draw[->] (5,7) -- (5,8);
    \end{tikzpicture}
    \caption{航行流程}
\end{figure}

协议分层是为了使各层之间相互独立，每一层只专注于做一类事情。各层之间相互独立，各层之间不需要关心其它层是如何实现的，只需要知道自己如何调用下层提供好的功能就可以。同时协议分层提高了整体灵活性，每一层都可以使用最适合的技术来实现，只需要保证提供的功能以及暴露的接口的规则没有改变就行。\\

各层的所有协议被称为协议栈，TCP/IP协议栈由5个层次组成，分为是物理层、链路层、网络层、传输层和应用层。\\

ISO（International Organization for Standard）为了更好地使网络应用更为普及，推出了OSI（Open System Interconnection）参考模型。但因为OSI七层模型出现地比TCP/IP五层模型晚，在OSI开始使用之前，TCP/IP已经被广泛使用，最终OSI没有在实践中被广泛应用。\\

\begin{table}[H]
    \centering
    \setlength{\tabcolsep}{5mm}{
        \begin{tabular}{|c|l|}
            \hline
            \textbf{协议层} & \textbf{功能}                         \\
            \hline
            应用层          & 提供网络服务操作接口                  \\
            \hline
            表示层          & 对要传输的数据进行处理                \\
            \hline
            会话层          & 管理不同通讯节点之间的连接信息        \\
            \hline
            传输层          & 建立不同节点之间的网络连接            \\
            \hline
            网络层          & 将网络地址映射为MAC地址实现数据包转发 \\
            \hline
            数据链路层      & 将要发送的数据包转为数据帧            \\
            \hline
            物理层          & 利用物理设备实现数据的传输            \\
            \hline
        \end{tabular}
    }
    \caption{OSI七层模型}
\end{table}

\vspace{0.5cm}

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,0) rectangle (3,7);
        \draw (8,0) rectangle (11,7);
        \draw (0,1) -- (3,1);
        \draw (0,2) -- (3,2);
        \draw (0,3) -- (3,3);
        \draw (0,4) -- (3,4);
        \draw (0,5) -- (3,5);
        \draw (0,6) -- (3,6);
        \draw (8,1) -- (11,1);
        \draw (8,2) -- (11,2);
        \draw (8,3) -- (11,3);
        \draw (8,4) -- (11,4);
        \draw (8,5) -- (11,5);
        \draw (8,6) -- (11,6);

        \draw (1.5,6.5) node{应用层};
        \draw (1.5,5.5) node{表示层};
        \draw (1.5,4.5) node{会话层};
        \draw (1.5,3.5) node{传输层};
        \draw (1.5,2.5) node{网络层};
        \draw (1.5,1.5) node{数据链路层};
        \draw (1.5,0.5) node{物理层};
        \draw (9.5,6.5) node{应用层};
        \draw (9.5,5.5) node{表示层};
        \draw (9.5,4.5) node{会话层};
        \draw (9.5,3.5) node{传输层};
        \draw (9.5,2.5) node{网络层};
        \draw (9.5,1.5) node{数据链路层};
        \draw (9.5,0.5) node{物理层};

        \draw[->, very thick] (-1,7) -- (-1,0);
        \draw[->, very thick] (12,0) -- (12,7);
        \draw[->] (1.5,0) -- (1.5,-1) -- (9.5,-1) -- (9.5,0);
    \end{tikzpicture}
    \caption{数据传输}
\end{figure}

\vspace{0.5cm}

\subsection{封装（Encapsulation）}

在发送主机端，应用层报文（application-layer message）被传送给传输层，传输层收取到报文并附加首部信息，形成传输层报文段（transport-layer segment），被添加的首部将被接收端的传输层使用。首部信息包括了交付应用程序信息、差错检测位信息等。\\

传输层继续向网络层传递该报文段，网络层再添加首部信息，如源和目的端系统地址等，形成了网络层数据报（network-layer datagram）。\\

该数据报接下来被传递给链路层，链路层添加其首部信息，形成链路层帧（link-layer frame）。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,0) rectangle (2.5,2.5);
        \draw (0,0.5) -- (2.5,0.5);
        \draw (0,1) -- (2.5,1);
        \draw (0,1.5) -- (2.5,1.5);
        \draw (0,2) -- (2.5,2);
        \draw (0,2.5) -- (2.5,2.5);
        \draw (1.25,2.25) node {Application};
        \draw (1.25,1.75) node {Transport};
        \draw (1.25,1.25) node {Network};
        \draw (1.25,0.75) node {Link};
        \draw (1.25,0.25) node {Physical};
        \draw (1.25,3) node {Source};

        \draw[blue] (-1,2.05) rectangle (-0.25,2.45);
        \draw (-0.625,2.25) node {M};
        \draw (-2,2.25) node {Message};
        \draw[blue] (-1.75,1.55) rectangle (-0.25,1.95);
        \draw[blue] (-1,1.55) -- (-1,1.95);
        \draw (-0.625,1.75) node {M};
        \draw (-1.35,1.75) node {$ H_t $};
        \draw (-2.75,1.75) node {Segment};
        \draw[blue] (-2.5,1.05) rectangle (-0.25,1.45);
        \draw[blue] (-1,1.05) -- (-1,1.45);
        \draw[blue] (-1.75,1.05) -- (-1.75,1.45);
        \draw (-0.625,1.25) node {M};
        \draw (-1.35,1.25) node {$ H_t $};
        \draw (-2.15,1.25) node {$ H_n $};
        \draw (-3.75,1.25) node {Datagram};
        \draw[blue] (-3.25,0.55) rectangle (-0.25,0.95);
        \draw[blue] (-1,0.55) -- (-1,0.95);
        \draw[blue] (-1.75,0.55) -- (-1.75,0.95);
        \draw[blue] (-2.5,0.55) -- (-2.5,0.95);
        \draw (-0.625,0.75) node {M};
        \draw (-1.35,0.75) node {$ H_t $};
        \draw (-2.15,0.75) node {$ H_n $};
        \draw (-2.85,0.75) node {$ H_l $};
        \draw (-4.25,0.75) node {Frame};

        \draw (0,-10) rectangle (2.5,-7.5);
        \draw (0,-9.5) -- (2.5,-9.5);
        \draw (0,-9) -- (2.5,-9);
        \draw (0,-8.5) -- (2.5,-8.5);
        \draw (0,-8) -- (2.5,-8);
        \draw (0,-7.5) -- (2.5,-7.5);
        \draw (1.25,-7.75) node {Application};
        \draw (1.25,-8.25) node {Transport};
        \draw (1.25,-8.75) node {Network};
        \draw (1.25,-9.25) node {Link};
        \draw (1.25,-9.75) node {Physical};
        \draw (1.25,-7) node {Destination};

        \draw[blue] (-1,-7.95) rectangle (-0.25,-7.55);
        \draw (-0.625,-7.75) node {M};
        \draw[blue] (-1.75,-8.45) rectangle (-0.25,-8.05);
        \draw[blue] (-1,-8.45) -- (-1,-8.05);
        \draw (-0.625,-8.25) node {M};
        \draw (-1.35,-8.25) node {$ H_t $};
        \draw[blue] (-2.5,-8.95) rectangle (-0.25,-8.55);
        \draw[blue] (-1,-8.95) -- (-1,-8.55);
        \draw[blue] (-1.75,-8.95) -- (-1.75,-8.55);
        \draw (-0.625,-8.75) node {M};
        \draw (-1.35,-8.75) node {$ H_t $};
        \draw (-2.15,-8.75) node {$ H_n $};
        \draw[blue] (-3.25,-9.45) rectangle (-0.25,-9.05);
        \draw[blue] (-1,-9.45) -- (-1,-9.05);
        \draw[blue] (-1.75,-9.45) -- (-1.75,-9.05);
        \draw[blue] (-2.5,-9.45) -- (-2.5,-9.05);
        \draw (-0.625,-9.25) node {M};
        \draw (-1.35,-9.25) node {$ H_t $};
        \draw (-2.15,-9.25) node {$ H_n $};
        \draw (-2.85,-9.25) node {$ H_l $};

        \draw (5,-2) rectangle (7.5,-3);
        \draw (5,-2.5) -- (7.5,-2.5);
        \draw (6.25,-2.25) node {Link};
        \draw (6.25,-2.75) node {Physical};
        \draw (6.25,-1.5) node {Link-layer Switch};

        \draw (4.5,-5) rectangle (7,-6.5);
        \draw (4.5,-5.5) -- (7,-5.5);
        \draw (4.5,-6) -- (7,-6);
        \draw (5.75,-5.25) node {Network};
        \draw (5.75,-5.75) node {Link};
        \draw (5.75,-6.25) node {Physical};
        \draw (5.75,-4.5) node {Router};

        \draw[->, very thick, orange] (2.35,2.65) -- (2.35,-3.2) -- (5.15,-3.2) -- (5.15,-1.85) -- (7.35,-1.85) -- (7.35,-7) -- (6.85,-7) -- (6.85,-4.85) -- (4.65,-4.85) -- (4.65,-10.35) -- (2.35,-10.35) -- (2.35,-7.15);
    \end{tikzpicture}
    \caption{封装}
\end{figure}

\newpage

\section{网络安全}

\subsection{网络攻击}

2000年2月7日，化名MafiaBoy的15岁加拿大少年攻击了Yahoo、Amazon和eBay，使这些网站瘫痪达数小时，造成了超过12亿美元的损失，在股市中造成混乱。MafiaBoy后来被透露为一名名叫Michael Calce的高中生，通过入侵几所大学的网络并利用其服务器进行DDoS攻击。这次袭击直接导致了今天许多网络犯罪法的制定。现在MafiaBoy已经金盆洗手，从事网络安全行业工作。\\

2017年1月，University of Albert内20个教室和实验室的300台电脑被安装恶意软件，导致近3000名学生的用户信息被盗。\\

2017年4月，一名Laurentian University的CS学生为了证明学校的系统容易受到攻击，从而入侵了学校系统，导致近2000名学生的个人记录（包括密码、电话号码、成绩等）被泄漏。\\

因特网最初的设计理念是让一群相互信任的用户连接到一个透明的网络上，因此安全性并没有太过必要。然而如今的网络不再是完全透明和相互信任的，因此网络安全领域需要研究如何攻击计算机网络、如何防御免受攻击和如何设计能够更好地避免攻击的体系。\\

\subsection{恶意软件}

多数的恶意软件（malware）通过自我复制（self-replicating）传播，一旦设备感染了恶意软件，就有可能导致文件丢失、隐私泄漏等。恶意软件能够以病毒（virus）或蠕虫（worm）的形式传播。病毒是利用用户交互来感染用户设备的，例如包含恶意代码的电子邮件附件，如果用户无意打开附件，就会在其设备上运行恶意软件。另一种蠕虫则无需任何用户交互，例如用户在使用某些比较脆弱的网络应用程序时，该应用可能用因特网接受恶意软件并运行。\\

\subsection{DoS攻击}

另一种通过攻击服务器和网络基础设施的威胁称为拒绝服务攻击（DoS, Denial-of-Service）。例如泛洪攻击，攻击者通过向目标主机发送大量的分组，堵塞目标的接入链路，使得合法分组无法到达服务器。但是如果服务器的接入速率非常大的话，单一的攻击源无法产生足够大的流量来伤害服务器。因此攻击者可以通过控制多个源向目标发送大量流量，这种方法称为分布式DoS（DDoS, Distributed DoS）。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}[every node/.style={minimum width=1.5cm}]
        \draw (0,0) rectangle (2,1);
        \node at (1,0.5) {Target};

        \node[priest, evil] at (-2,3) {};
        \node[priest, evil] at (-2,0) {};
        \node[priest, evil] at (-2,-3) {};
        \node[priest, evil] at (1,3) {};
        \node[priest, evil, mirrored] at (4,3) {};
        \node[priest, evil, mirrored] at (4,0) {};
        \node[priest, evil, mirrored] at (4,-3) {};
        \node[priest, evil, mirrored] at (1,-3) {};

        \draw[->, thick, red] (-2,3) -- (0,1);
        \draw[->, thick, red] (-2,0) -- (0,0.5);
        \draw[->, thick, red] (-2,-3) -- (0,0);
        \draw[->, thick, red] (1,3) -- (1,1);
        \draw[->, thick, red] (4,3) -- (2,1);
        \draw[->, thick, red] (4,0) -- (2,0.5);
        \draw[->, thick, red] (4,-3) -- (2,0);
        \draw[->, thick, red] (1,-3) -- (1,0);
    \end{tikzpicture}
    \caption{DDoS}
\end{figure}

\vspace{0.5cm}

\subsection{IP欺骗（IP Spoofing）}

IP欺骗是指伪造源IP地址，以便冒充其它系统或发件人的身份，从而冒充另外一台机器与服务器打交道。IP欺骗会造成目标系统受到攻击却无法确认攻击源，或者取得目标系统的信任以便获取机密信息。IP欺骗的防范，一方面需要目标设备采取更强有力的认证措施，不仅仅根据源IP就信任来访者，还需要更多的认证手段。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}[every node/.style={minimum width=1.5cm}]
        \draw (0,0) rectangle (2,1);
        \node at (1,0.5) {A};

        \draw (8,-4) rectangle (10,-3);
        \node at (9,-3.5) {B};

        \node[priest, evil] at (6,1) {};

        \draw (1,0) -- (1,-1.5) -- (9,-1.5) -- (9,-3);
        \draw (6,0) -- (6,-1.5);

        \draw (1.5,-3) rectangle (5.5,-2);
        \node[red] at (2.5,-2.5) {src: B};
        \node at (4.25,-2.5) {dest: A};

        \draw[red] (6.5,0) -- (6.5,-2.5) -- (5.5,-2.5);
        \draw[red, ->] (1.5,-2.5) -- (0.5,-2.5) -- (0.5,0);
    \end{tikzpicture}
    \caption{IP欺骗}
\end{figure}

\newpage